diff options
Diffstat (limited to 'drivers/usb/musb/musb_host.c')
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index cf3705fd78c..1ce1fcf3f3e 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -756,7 +756,13 @@ static void musb_ep_program(struct musb *musb, u8 epnum,  		/* general endpoint setup */  		if (epnum) {  			/* flush all old state, set default */ -			musb_h_tx_flush_fifo(hw_ep); +			/* +			 * We could be flushing valid +			 * packets in double buffering +			 * case +			 */ +			if (!hw_ep->tx_double_buffered) +				musb_h_tx_flush_fifo(hw_ep);  			/*  			 * We must not clear the DMAMODE bit before or in @@ -773,11 +779,13 @@ static void musb_ep_program(struct musb *musb, u8 epnum,  					);  			csr |= MUSB_TXCSR_MODE; -			if (usb_gettoggle(urb->dev, qh->epnum, 1)) -				csr |= MUSB_TXCSR_H_WR_DATATOGGLE -					| MUSB_TXCSR_H_DATATOGGLE; -			else -				csr |= MUSB_TXCSR_CLRDATATOG; +			if (!hw_ep->tx_double_buffered) { +				if (usb_gettoggle(urb->dev, qh->epnum, 1)) +					csr |= MUSB_TXCSR_H_WR_DATATOGGLE +						| MUSB_TXCSR_H_DATATOGGLE; +				else +					csr |= MUSB_TXCSR_CLRDATATOG; +			}  			musb_writew(epio, MUSB_TXCSR, csr);  			/* REVISIT may need to clear FLUSHFIFO ... */  |