RE: [PATCH] musb: fix ISOC Tx programming for CPPI DMAs

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

 



> > We have tested and it doesn't work with current driver. Have you tested
> it and was it working for you ?
> >
> 
>    Not with the current driver, I must admit. I'll try it today...
> 
> >>> diff --git a/drivers/usb/musb/musb_host.c
> b/drivers/usb/musb/musb_host.c
> >>> index cf94511..e3ab40a 100644
> >>> --- a/drivers/usb/musb/musb_host.c
> >>> +++ b/drivers/usb/musb/musb_host.c
> >>> @@ -1301,8 +1301,11 @@ void musb_host_tx(struct musb *musb, u8 epnum)
> >>>  		return;
> >>>  	} else	if (usb_pipeisoc(pipe) && dma) {
> >>>  		if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb,
> >>> -				offset, length))
> >>> +				offset, length)) {
> >>> +			if (is_cppi_enabled() || tusb_dma_omap())
> >>> +				musb_h_tx_dma_start(hw_ep);
> >>>  			return;
> >>>
> >>>
> >>    It will have been already started by this moment -- from
> >> musb_start_urb() which is enough . Otherwise it wouldn't work, and I've
> >> made sure it *does* work.
> >>
> >
> > This part is being done at musb_host_rx()
> 
>    You're doing it in musb_host_tx() actually. Although musb_host_rx()
> is also broken WRT the isochronous transfers.
> 
> >  doing next packet programming within same urb and *not* starting next
> urb. Thus musb_start_urb() doesn't come into this path.
> 
>    What? Read the code, please -- musb_start_urb() call should always
> precede musb_host_tx() which handles the DMA interrupt. Unless something
> clears DMAReqEnab after musb_start_urb() call, setting it only once
> should work.

musb_start_urb() call does precede musb_host_tx() but when urb is *completed*. 

check the 'done' flag and musb_advance_schedule getting called in the path.

if (done) {
                /* set status */
                urb->status = status;
                urb->actual_length = qh->offset;
                musb_advance_schedule(musb, urb, hw_ep, USB_DIR_OUT);
                return;
} else  if (usb_pipeisoc(pipe) && dma) {
         if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb,
                                offset, length)) {
                if (is_cppi_enabled() || tusb_dma_omap()
                                || is_cppi41_enabled())
                    musb_h_tx_dma_start(hw_ep);
           return;
}


> 
> > So it wouldn't start the DMAs.
> >
> 
>    How musb_host_tx() can be called without musb_start_urb()?
> 
> > In case of PIO, it does load the FIFO and sets the TXPKTREADY.
> >
> 
>    Only is URB_ISO_ASAP is not set.
> 
> WBR, Sergei
> 
> > -Ajay
> 
> WBR, Sergei
> 
> 

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