Re: [PATCH v4 2/3] mailbox: Add iProc mailbox controller driver

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

 




On Fri, Jan 27, 2017 at 2:08 AM, Jonathan Richardson
<jonathan.richardson@xxxxxxxxxxxx> wrote:

> +static int iproc_mbox_send_data_m0(struct mbox_chan *chan, void *data)
> +{
> +       struct iproc_mbox *mbox = dev_get_drvdata(chan->mbox->dev);
> +       struct iproc_mbox_msg *msg = (struct iproc_mbox_msg *)data;
> +               unsigned long flags;
> +       int err = 0;
> +       const int poll_period_us = 5;
> +       const int max_retries = (MAX_M0_TIMEOUT_MS * 1000) / poll_period_us;
> +
> +       if (!msg)
> +               return -EINVAL;
> +
> +       spin_lock_irqsave(&mbox->lock, flags);
> +
> +       dev_dbg(mbox->dev, "Send msg to M0: cmd=0x%x, param=0x%x, wait_ack=%d\n",
> +               msg->cmd, msg->param, msg->wait_ack);
> +
prints should be outside the spinlocks.

> +       writel(msg->cmd, mbox->base + IPROC_CRMU_MAILBOX0_OFFSET);
> +       writel(msg->param, mbox->base + IPROC_CRMU_MAILBOX1_OFFSET);
> +
> +       if (msg->wait_ack) {
> +               int retries;
> +
move poll_period_us and max_retries in here or just define' them

> +               err = msg->reply_code = -ETIMEDOUT;
> +               for (retries = 0; retries < max_retries; retries++) {
> +                       u32 val = readl(
> +                               mbox->base + IPROC_CRMU_MAILBOX0_OFFSET);
> +                       if (val & M0_IPC_CMD_DONE_MASK) {
> +                               /*
> +                                * M0 replied - save reply code and
> +                                * clear error.
> +                                */
> +                               msg->reply_code = (val &
> +                                       M0_IPC_CMD_REPLY_MASK) >>
> +                                       M0_IPC_CMD_REPLY_SHIFT;
> +                               err = 0;
> +                               break;
> +                       }
> +                       udelay(poll_period_us);
>
potentially 2ms inside spin_lock_irqsave. Alternative is to implement
a simple 'peek_data' and call it for requests with 'wait_ack'
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux