On Sun, Jan 12, 2020 at 11:18 PM Samuel Holland <samuel@xxxxxxxxxxxx> wrote: > > +static int sun6i_msgbox_send_data(struct mbox_chan *chan, void *data) > +{ > + struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan); > + int n = channel_number(chan); > + uint32_t msg = *(uint32_t *)data; > + > + /* Using a channel backwards gets the hardware into a bad state. */ > + if (WARN_ON_ONCE(!(readl(mbox->regs + CTRL_REG(n)) & CTRL_TX(n)))) > + return 0; > + > + /* We cannot post a new message if the FIFO is full. */ > + if (readl(mbox->regs + FIFO_STAT_REG(n)) & FIFO_STAT_MASK) { > + mbox_dbg(mbox, "Channel %d busy sending 0x%08x\n", n, msg); > + return -EBUSY; > + } > + This check should go into sun6i_msgbox_last_tx_done(). send_data() assumes all is clear to send next packet. ..... > + > + mbox->controller.dev = dev; > + mbox->controller.ops = &sun6i_msgbox_chan_ops; > + mbox->controller.chans = chans; > + mbox->controller.num_chans = NUM_CHANS; > + mbox->controller.txdone_irq = false; > + mbox->controller.txdone_poll = true; > + mbox->controller.txpoll_period = 5; > + nit: just a single space should do too. Sorry, for some reason I thought I had replied to this patch, but apparently not. My mistake. Do you want to revise this submission or send another patch on top? thanks