Loading drivers/usb/musb/musb_host.c +44 −17 Original line number Original line Diff line number Diff line Loading @@ -1533,6 +1533,44 @@ void musb_host_tx(struct musb *musb, u8 epnum) MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); } } #ifdef CONFIG_USB_TI_CPPI41_DMA /* Seems to set up ISO for cppi41 and not advance len. See commit c57c41d */ static int musb_rx_dma_iso_cppi41(struct dma_controller *dma, struct musb_hw_ep *hw_ep, struct musb_qh *qh, struct urb *urb, size_t len) { struct dma_channel *channel = hw_ep->tx_channel; void __iomem *epio = hw_ep->regs; dma_addr_t *buf; u32 length, res; u16 val; buf = (void *)urb->iso_frame_desc[qh->iso_idx].offset + (u32)urb->transfer_dma; length = urb->iso_frame_desc[qh->iso_idx].length; val = musb_readw(epio, MUSB_RXCSR); val |= MUSB_RXCSR_DMAENAB; musb_writew(hw_ep->regs, MUSB_RXCSR, val); res = dma->channel_program(channel, qh->maxpacket, 0, (u32)buf, length); return res; } #else static inline int musb_rx_dma_iso_cppi41(struct dma_controller *dma, struct musb_hw_ep *hw_ep, struct musb_qh *qh, struct urb *urb, size_t len) { return false; } #endif #ifdef CONFIG_USB_INVENTRA_DMA #ifdef CONFIG_USB_INVENTRA_DMA Loading Loading @@ -1746,25 +1784,14 @@ void musb_host_rx(struct musb *musb, u8 epnum) if (++qh->iso_idx >= urb->number_of_packets) { if (++qh->iso_idx >= urb->number_of_packets) { done = true; done = true; } else { } else { #if defined(CONFIG_USB_TI_CPPI41_DMA) struct dma_controller *c = musb->dma_controller; struct dma_controller *c; dma_addr_t *buf; u32 length, ret; c = musb->dma_controller; buf = (void *) urb->iso_frame_desc[qh->iso_idx].offset + (u32)urb->transfer_dma; length = /* REVISIT: Why ignore return value here? */ urb->iso_frame_desc[qh->iso_idx].length; if (musb_dma_cppi41(musb)) done = musb_rx_dma_iso_cppi41(c, hw_ep, qh, urb, xfer_len); val |= MUSB_RXCSR_DMAENAB; musb_writew(hw_ep->regs, MUSB_RXCSR, val); ret = c->channel_program(dma, qh->maxpacket, 0, (u32) buf, length); #endif done = false; done = false; } } Loading Loading
drivers/usb/musb/musb_host.c +44 −17 Original line number Original line Diff line number Diff line Loading @@ -1533,6 +1533,44 @@ void musb_host_tx(struct musb *musb, u8 epnum) MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); } } #ifdef CONFIG_USB_TI_CPPI41_DMA /* Seems to set up ISO for cppi41 and not advance len. See commit c57c41d */ static int musb_rx_dma_iso_cppi41(struct dma_controller *dma, struct musb_hw_ep *hw_ep, struct musb_qh *qh, struct urb *urb, size_t len) { struct dma_channel *channel = hw_ep->tx_channel; void __iomem *epio = hw_ep->regs; dma_addr_t *buf; u32 length, res; u16 val; buf = (void *)urb->iso_frame_desc[qh->iso_idx].offset + (u32)urb->transfer_dma; length = urb->iso_frame_desc[qh->iso_idx].length; val = musb_readw(epio, MUSB_RXCSR); val |= MUSB_RXCSR_DMAENAB; musb_writew(hw_ep->regs, MUSB_RXCSR, val); res = dma->channel_program(channel, qh->maxpacket, 0, (u32)buf, length); return res; } #else static inline int musb_rx_dma_iso_cppi41(struct dma_controller *dma, struct musb_hw_ep *hw_ep, struct musb_qh *qh, struct urb *urb, size_t len) { return false; } #endif #ifdef CONFIG_USB_INVENTRA_DMA #ifdef CONFIG_USB_INVENTRA_DMA Loading Loading @@ -1746,25 +1784,14 @@ void musb_host_rx(struct musb *musb, u8 epnum) if (++qh->iso_idx >= urb->number_of_packets) { if (++qh->iso_idx >= urb->number_of_packets) { done = true; done = true; } else { } else { #if defined(CONFIG_USB_TI_CPPI41_DMA) struct dma_controller *c = musb->dma_controller; struct dma_controller *c; dma_addr_t *buf; u32 length, ret; c = musb->dma_controller; buf = (void *) urb->iso_frame_desc[qh->iso_idx].offset + (u32)urb->transfer_dma; length = /* REVISIT: Why ignore return value here? */ urb->iso_frame_desc[qh->iso_idx].length; if (musb_dma_cppi41(musb)) done = musb_rx_dma_iso_cppi41(c, hw_ep, qh, urb, xfer_len); val |= MUSB_RXCSR_DMAENAB; musb_writew(hw_ep->regs, MUSB_RXCSR, val); ret = c->channel_program(dma, qh->maxpacket, 0, (u32) buf, length); #endif done = false; done = false; } } Loading