> -----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