On Fri, Jan 21, 2011 at 2:43 PM, Felipe Balbi <balbi@xxxxxx> wrote: > On Fri, Jan 21, 2011 at 02:37:58PM +0800, Bob Liu wrote: >> On Fri, Jan 21, 2011 at 2:25 PM, Felipe Balbi <balbi@xxxxxx> wrote: >> > Hi, >> > >> > On Fri, Jan 21, 2011 at 01:39:20PM +0800, Bob Liu wrote: >> >> diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c >> >> index 4d5bcb4..7a9ab45 100644 >> >> --- a/drivers/usb/musb/musb_host.c >> >> +++ b/drivers/usb/musb/musb_host.c >> >> @@ -609,7 +609,7 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) >> >>    /* Set RXMAXP with the FIFO size of the endpoint >> >>    Â* to disable double buffer mode. >> >>    Â*/ >> >> -   if (musb->hwvers < MUSB_HWVERS_2000) >> >> +   if (musb->double_buffer_not_ok) >> >>        musb_writew(ep->regs, MUSB_RXMAXP, ep->max_packet_sz_rx); >> >>    else >> >>        musb_writew(ep->regs, MUSB_RXMAXP, >> > >> > you're only changing RX path, does double buffering work on TX path ? >> > This patch seems incomplete for host side. My original version was >> > changing both RX and TX. >> > >> >> Oh, ÂI just replaced origin positions where have "MUSB_HWVERS_2000". >> But I agree with changing TX path also. > > here's updated original patch, please test and reply with a tested-by or > acked-by or signed-off-by flag: > Thank you! I will test it soon. > commit 149e557050b1e1731704dda68b606f306ae8ace2 > Author: Felipe Balbi <balbi@xxxxxx> > Date:  Fri Jan 21 13:39:20 2011 +0800 > >  Âusb: musb: disable double buffering when it's broken > >  ÂWe know that blackfin doesn't support double >  Âbuffering feature as of today. So we add a >  Âflag set by musb_platform_init() to forcefully >  Âdisable that feature. > >  ÂSuch flag is created and marked as deprecated >  Âto force us to find a solution for the missing >  Âdouble buffering support on blackfin. > >  ÂSigned-off-by: Felipe Balbi <balbi@xxxxxx> > > diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c > index eeba228..9d49d1c 100644 > --- a/drivers/usb/musb/blackfin.c > +++ b/drivers/usb/musb/blackfin.c > @@ -404,6 +404,7 @@ static int bfin_musb_init(struct musb *musb) >        Âmusb->xceiv->set_power = bfin_musb_set_power; > >    Âmusb->isr = blackfin_interrupt; > +    musb->double_buffer_not_ok = true; > >    Âreturn 0; > Â} > diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h > index d0c236f..d74a811 100644 > --- a/drivers/usb/musb/musb_core.h > +++ b/drivers/usb/musb/musb_core.h > @@ -488,6 +488,18 @@ struct musb { >    Âunsigned        Âset_address:1; >    Âunsigned        Âtest_mode:1; >    Âunsigned        Âsoftconnect:1; > +    /* > +    Â* FIXME: Remove this flag. > +    Â* > +    Â* This is only added to allow Blackfin to work > +    Â* with current driver. For some unknown reason > +    Â* Blackfin doesn't work with double buffering > +    Â* and that's enabled by default. > +    Â* > +    Â* We added this flag to forcefully disable double > +    Â* buffering until we get it working. > +    Â*/ > +    unsigned        Âdouble_buffer_not_ok:1 __deprecated; > >    Âu8           Âaddress; >    Âu8           Âtest_mode_nr; > diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c > index ed58c6c..bee8106 100644 > --- a/drivers/usb/musb/musb_gadget.c > +++ b/drivers/usb/musb/musb_gadget.c > @@ -989,7 +989,10 @@ static int musb_gadget_enable(struct usb_ep *ep, >        Â/* Set TXMAXP with the FIFO size of the endpoint >         * to disable double buffering mode. >         */ > -        musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); > +        if (musb->double_buffer_not_ok) > +            musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx); > +        else > +            musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); > >        Âcsr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG; >        Âif (musb_readw(regs, MUSB_TXCSR) > @@ -1025,7 +1028,10 @@ static int musb_gadget_enable(struct usb_ep *ep, >        Â/* Set RXMAXP with the FIFO size of the endpoint >         * to disable double buffering mode. >         */ > -        musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); > +        if (musb->double_buffer_not_ok) > +            musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_tx); > +        else > +            musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz | (musb_ep->hb_mult << 11)); > >        Â/* 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 4d5bcb4..0f523d7 100644 > --- a/drivers/usb/musb/musb_host.c > +++ b/drivers/usb/musb/musb_host.c > @@ -609,7 +609,7 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) >    Â/* Set RXMAXP with the FIFO size of the endpoint >     * to disable double buffer mode. >     */ > -    if (musb->hwvers < MUSB_HWVERS_2000) > +    if (musb->double_buffer_not_ok) >        Âmusb_writew(ep->regs, MUSB_RXMAXP, ep->max_packet_sz_rx); >    Âelse >        Âmusb_writew(ep->regs, MUSB_RXMAXP, > @@ -784,14 +784,13 @@ static void musb_ep_program(struct musb *musb, u8 epnum, >        Â/* protocol/endpoint/interval/NAKlimit */ >        Âif (epnum) { >            Âmusb_writeb(epio, MUSB_TXTYPE, qh->type_reg); > -            if (can_bulk_split(musb, qh->type)) > +            if (musb->double_buffer_not_ok) But I can't understand why change can_bulk_split() to double_buffer_not_ok. In my opinion, there are two different thing. >                Âmusb_writew(epio, MUSB_TXMAXP, > -                    packet_sz > -                    | ((hw_ep->max_packet_sz_tx / > -                        packet_sz) - 1) << 11); > +                        hw_ep->max_packet_sz_tx); >            Âelse >                Âmusb_writew(epio, MUSB_TXMAXP, > -                    packet_sz); > +                        qh->maxpacket | > +                        ((qh->hb_mult - 1) << 11)); >            Âmusb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg); >        Â} else { >            Âmusb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg); > -- Regards, --Bob -- 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