cppi41_channel
struct cppi41_channel *c;
struct cppi41_channel *chan_busy[ALLOC_DECS_NUM];
static struct cppi41_channel *to_cpp41_chan(struct dma_chan *c)
return container_of(c, struct cppi41_channel, chan);
static struct cppi41_channel *desc_to_chan(struct cppi41_dd *cdd, u32 desc)
struct cppi41_channel *c;
struct cppi41_channel *c;
struct cppi41_channel *c = to_cpp41_chan(chan);
struct cppi41_channel *c = to_cpp41_chan(chan);
struct cppi41_channel *c = to_cpp41_chan(chan);
static void push_desc_queue(struct cppi41_channel *c)
struct cppi41_channel *c, *_c;
struct cppi41_channel *c = to_cpp41_chan(chan);
static u32 get_host_pd1(struct cppi41_channel *c)
static u32 get_host_pd2(struct cppi41_channel *c)
struct cppi41_channel *c = to_cpp41_chan(chan);
static int cppi41_tear_down_chan(struct cppi41_channel *c)
struct cppi41_channel *c = to_cpp41_chan(chan);
struct cppi41_channel *cc, *_ct;
struct cppi41_channel *cchan, *chans;
struct cppi41_channel *cchan;
static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel)
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
if (!cppi41_channel->prog_len ||
(cppi41_channel->channel.status == MUSB_DMA_STATUS_FREE)) {
cppi41_channel->channel.actual_len =
cppi41_channel->transferred;
cppi41_channel->channel.status = MUSB_DMA_STATUS_FREE;
cppi41_channel->channel.rx_packet_done = true;
if (cppi41_channel->tx_zlp && (cppi41_channel->transferred %
cppi41_channel->packet_sz) == 0) {
trace_musb_cppi41_done(cppi41_channel);
musb_dma_completion(musb, hw_ep->epnum, cppi41_channel->is_tx);
struct dma_chan *dc = cppi41_channel->dc;
cppi41_channel->buf_addr += cppi41_channel->packet_sz;
remain_bytes = cppi41_channel->total_len;
remain_bytes -= cppi41_channel->transferred;
remain_bytes = min(remain_bytes, cppi41_channel->packet_sz);
cppi41_channel->prog_len = remain_bytes;
direction = cppi41_channel->is_tx ? DMA_MEM_TO_DEV
cppi41_channel->buf_addr,
dma_desc->callback_param = &cppi41_channel->channel;
cppi41_channel->cookie = dma_desc->tx_submit(dma_desc);
trace_musb_cppi41_cont(cppi41_channel);
if (!cppi41_channel->is_tx) {
struct cppi41_dma_channel *cppi41_channel, *n;
list_for_each_entry_safe(cppi41_channel, n, &controller->early_tx_list,
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
list_del_init(&cppi41_channel->tx_check);
cppi41_trans_done(cppi41_channel);
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
controller = cppi41_channel->controller;
dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie,
transferred = cppi41_channel->prog_len - txstate.residue;
cppi41_channel->transferred += transferred;
trace_musb_cppi41_gb(cppi41_channel);
update_rx_toggle(cppi41_channel);
if (cppi41_channel->transferred == cppi41_channel->total_len ||
transferred < cppi41_channel->packet_sz)
cppi41_channel->prog_len = 0;
if (cppi41_channel->is_tx) {
if (!cppi41_channel->is_tx || empty) {
cppi41_trans_done(cppi41_channel);
cppi41_trans_done(cppi41_channel);
list_add_tail(&cppi41_channel->tx_check,
unsigned long usecs = cppi41_channel->total_len / 10;
static void cppi41_set_dma_mode(struct cppi41_dma_channel *cppi41_channel,
struct cppi41_dma_controller *controller = cppi41_channel->controller;
if (cppi41_channel->is_tx)
port = cppi41_channel->port_num;
if (cppi41_channel->is_tx) {
static void da8xx_set_dma_mode(struct cppi41_dma_channel *cppi41_channel,
struct cppi41_dma_controller *controller = cppi41_channel->controller;
port = cppi41_channel->port_num;
if (!cppi41_channel->is_tx)
static void cppi41_set_autoreq_mode(struct cppi41_dma_channel *cppi41_channel,
struct cppi41_dma_controller *controller = cppi41_channel->controller;
port = cppi41_channel->port_num;
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
struct cppi41_dma_controller *controller = cppi41_channel->controller;
struct dma_chan *dc = cppi41_channel->dc;
struct musb *musb = cppi41_channel->controller->controller.musb;
cppi41_channel->buf_addr = dma_addr;
cppi41_channel->total_len = len;
cppi41_channel->transferred = 0;
cppi41_channel->packet_sz = packet_sz;
cppi41_channel->tx_zlp = (cppi41_channel->is_tx && mode) ? 1 : 0;
if (cppi41_channel->is_tx)
RNDIS_REG(cppi41_channel->port_num), len);
controller->set_dma_mode(cppi41_channel,
cppi41_set_autoreq_mode(cppi41_channel,
RNDIS_REG(cppi41_channel->port_num), 0);
controller->set_dma_mode(cppi41_channel,
cppi41_set_autoreq_mode(cppi41_channel,
controller->set_dma_mode(cppi41_channel,
cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
cppi41_channel->prog_len = len;
direction = cppi41_channel->is_tx ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
cppi41_channel->cookie = dma_desc->tx_submit(dma_desc);
cppi41_channel->channel.rx_packet_done = false;
trace_musb_cppi41_config(cppi41_channel);
save_rx_toggle(cppi41_channel);
struct cppi41_dma_channel *cppi41_channel = NULL;
void (*set_dma_mode)(struct cppi41_dma_channel *cppi41_channel,
cppi41_channel = &controller->tx_channel[ch_num];
cppi41_channel = &controller->rx_channel[ch_num];
if (!cppi41_channel->dc)
if (cppi41_channel->is_allocated)
cppi41_channel->hw_ep = hw_ep;
cppi41_channel->is_allocated = 1;
trace_musb_cppi41_alloc(cppi41_channel);
return &cppi41_channel->channel;
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
trace_musb_cppi41_free(cppi41_channel);
if (cppi41_channel->is_allocated) {
cppi41_channel->is_allocated = 0;
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
if (is_host_active(cppi41_channel->controller->controller.musb)) {
if (cppi41_channel->is_tx)
hb_mult = cppi41_channel->hw_ep->out_qh->hb_mult;
hb_mult = cppi41_channel->hw_ep->in_qh->hb_mult;
static void save_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
struct cppi41_dma_controller *controller = cppi41_channel->controller;
if (cppi41_channel->hw_ep->ep_in.type != USB_ENDPOINT_XFER_BULK)
if (cppi41_channel->is_tx)
struct cppi41_dma_channel *cppi41_channel = channel->private_data;
struct cppi41_dma_controller *controller = cppi41_channel->controller;
void __iomem *epio = cppi41_channel->hw_ep->regs;
is_tx = cppi41_channel->is_tx;
trace_musb_cppi41_abort(cppi41_channel);
if (cppi41_channel->channel.status == MUSB_DMA_STATUS_FREE)
if (cppi41_channel->is_tx)
list_del_init(&cppi41_channel->tx_check);
cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
if (!is_host_active(cppi41_channel->controller->controller.musb))
tdbit = 1 << cppi41_channel->port_num;
ret = dmaengine_terminate_all(cppi41_channel->dc);
csr = musb_readw(cppi41_channel->hw_ep->regs, MUSB_RXCSR);
cppi41_channel->channel.status = MUSB_DMA_STATUS_FREE;
cppi41_channel->usb_toggle = toggle;
struct cppi41_dma_channel *cppi41_channel;
static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
cppi41_channel = &controller->tx_channel[port - 1];
cppi41_channel = &controller->rx_channel[port - 1];
cppi41_channel->controller = controller;
cppi41_channel->port_num = port;
cppi41_channel->is_tx = is_tx;
INIT_LIST_HEAD(&cppi41_channel->tx_check);
musb_dma = &cppi41_channel->channel;
musb_dma->private_data = cppi41_channel;
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
cppi41_channel->dc = dc;
if (cppi41_channel->is_tx)
if (!toggle && toggle == cppi41_channel->usb_toggle) {
musb_writew(cppi41_channel->hw_ep->regs, MUSB_RXCSR, csr);
cppi41_channel->usb_toggle = toggle;