diff options
| author | Patrick McHardy <kaber@trash.net> | 2010-04-20 16:02:01 +0200 | 
|---|---|---|
| committer | Patrick McHardy <kaber@trash.net> | 2010-04-20 16:02:01 +0200 | 
| commit | 62910554656cdcd6b6f84a5154c4155aae4ca231 (patch) | |
| tree | dcf14004f6fd2ef7154362ff948bfeba0f3ea92d /drivers/usb/host/ehci-sched.c | |
| parent | 22265a5c3c103cf8c50be62e6c90d045eb649e6d (diff) | |
| parent | ab9304717f7624c41927f442e6b6d418b2d8b3e4 (diff) | |
| download | olio-linux-3.10-62910554656cdcd6b6f84a5154c4155aae4ca231.tar.xz olio-linux-3.10-62910554656cdcd6b6f84a5154c4155aae4ca231.zip  | |
Merge branch 'master' of /repos/git/net-next-2.6
Conflicts:
	Documentation/feature-removal-schedule.txt
	net/ipv6/netfilter/ip6t_REJECT.c
	net/netfilter/xt_limit.c
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'drivers/usb/host/ehci-sched.c')
| -rw-r--r-- | drivers/usb/host/ehci-sched.c | 28 | 
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 39340ae00ac..a0aaaaff256 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -1123,8 +1123,8 @@ iso_stream_find (struct ehci_hcd *ehci, struct urb *urb)  					urb->interval);  		} -	/* if dev->ep [epnum] is a QH, info1.maxpacket is nonzero */ -	} else if (unlikely (stream->hw_info1 != 0)) { +	/* if dev->ep [epnum] is a QH, hw is set */ +	} else if (unlikely (stream->hw != NULL)) {  		ehci_dbg (ehci, "dev %s ep%d%s, not iso??\n",  			urb->dev->devpath, epnum,  			usb_pipein(urb->pipe) ? "in" : "out"); @@ -1565,13 +1565,27 @@ itd_patch(  static inline void  itd_link (struct ehci_hcd *ehci, unsigned frame, struct ehci_itd *itd)  { -	/* always prepend ITD/SITD ... only QH tree is order-sensitive */ -	itd->itd_next = ehci->pshadow [frame]; -	itd->hw_next = ehci->periodic [frame]; -	ehci->pshadow [frame].itd = itd; +	union ehci_shadow	*prev = &ehci->pshadow[frame]; +	__hc32			*hw_p = &ehci->periodic[frame]; +	union ehci_shadow	here = *prev; +	__hc32			type = 0; + +	/* skip any iso nodes which might belong to previous microframes */ +	while (here.ptr) { +		type = Q_NEXT_TYPE(ehci, *hw_p); +		if (type == cpu_to_hc32(ehci, Q_TYPE_QH)) +			break; +		prev = periodic_next_shadow(ehci, prev, type); +		hw_p = shadow_next_periodic(ehci, &here, type); +		here = *prev; +	} + +	itd->itd_next = here; +	itd->hw_next = *hw_p; +	prev->itd = itd;  	itd->frame = frame;  	wmb (); -	ehci->periodic[frame] = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD); +	*hw_p = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD);  }  /* fit urb's itds into the selected schedule slot; activate as needed */  |