RE: [PATCH 2/2 v2] USB: musb: disable double buffering for older RTL versions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Mike Frysinger
> Sent: Friday, January 29, 2010 7:14 AM
> To: linux-usb@xxxxxxxxxxxxxxx; Felipe Balbi
> Cc: uclinux-dist-devel@xxxxxxxxxxxxxxxxxxxx; Greg Kroah-Hartman; Cliff Cai
> Subject: [PATCH 2/2 v2] USB: musb: disable double buffering for older RTL
> versions
> 
> From: Cliff Cai <cliff.cai@xxxxxxxxxx>
> 
> Trying to use double buffer modes in RTL versions <2.0 may result in
> infinite hangs or data corruption.  So avoid them with older versions.
> 
> Signed-off-by: Cliff Cai <cliff.cai@xxxxxxxxxx>
> Signed-off-by: Mike Frysinger <vapier@xxxxxxxxxx>
> ---
> v2
> 	- fix checks in musb_host too
> 
>  drivers/usb/musb/musb_gadget.c |   17 +++++++++++++++--
>  drivers/usb/musb/musb_host.c   |   10 ++++++++--
>  2 files changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/musb/musb_gadget.c
> b/drivers/usb/musb/musb_gadget.c
> index cbcf14a..41de3a9 100644
> --- a/drivers/usb/musb/musb_gadget.c
> +++ b/drivers/usb/musb/musb_gadget.c
> @@ -895,7 +895,14 @@ static int musb_gadget_enable(struct usb_ep *ep,
>  		/* REVISIT if can_bulk_split(), use by updating "tmp";
>  		 * likewise high bandwidth periodic tx
>  		 */
> -		musb_writew(regs, MUSB_TXMAXP, tmp);
> +		/* Set TXMAXP with the FIFO size of the endpoint
> +		 * to disable double buffering mode. Currently, It seems that
> double
> +		 * buffering has problem if musb RTL revision number < 2.0.
> +		 */
> +		if (musb->hwvers < MUSB_HWVERS_2000)
> +			musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx);
> +		else
> +			musb_writew(regs, MUSB_TXMAXP, tmp);
> 
>  		csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG;
>  		if (musb_readw(regs, MUSB_TXCSR)
> @@ -925,7 +932,13 @@ static int musb_gadget_enable(struct usb_ep *ep,
>  		/* REVISIT if can_bulk_combine() use by updating "tmp"
>  		 * likewise high bandwidth periodic rx
>  		 */
> -		musb_writew(regs, MUSB_RXMAXP, tmp);
> +		/* Set RXMAXP with the FIFO size of the endpoint
> +		 * to disable double buffering mode.
> +		 */
> +		if (musb->hwvers < MUSB_HWVERS_2000)
> +			musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_rx);
> +		else
> +			musb_writew(regs, MUSB_RXMAXP, tmp);
> 
>  		/* force shared fifo to OUT-only mode */
>  		if (hw_ep->is_shared_fifo) {
> diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
> index 74c4c36..d21fffa 100644
> --- a/drivers/usb/musb/musb_host.c
> +++ b/drivers/usb/musb/musb_host.c
> @@ -605,8 +605,14 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh,
> struct musb_hw_ep *ep)
>  	musb_writeb(ep->regs, MUSB_RXTYPE, qh->type_reg);
>  	musb_writeb(ep->regs, MUSB_RXINTERVAL, qh->intv_reg);
>  	/* NOTE: bulk combining rewrites high bits of maxpacket */
> -	musb_writew(ep->regs, MUSB_RXMAXP,
> -			qh->maxpacket | ((qh->hb_mult - 1) << 11));
> +	/* Set RXMAXP with the FIFO size of the endpoint
> +	 * to disable double buffer mode.
> +	 */
> +	if (musb->hwvers < MUSB_HWVERS_2000)
> +		musb_writew(ep->regs, MUSB_RXMAXP, ep->max_packet_sz_rx);
> +	else
> +		musb_writew(ep->regs, MUSB_RXMAXP,
> +				qh->maxpacket | ((qh->hb_mult - 1) << 11));

This is done for high bandwidth ISOC transfers for setting value m (=2 0r 3)
To bits D11/D12. qh->maxpacket is taken from descriptor itself. See below line in urb_enqueue()

"      qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize);"

You need to modify D4 of TxFIFOSZ/RXFIFOSZ register for this.

-Ajay
> 
>  	ep->rx_reinit = 0;
>  }
> --
> 1.6.6.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux