Hi,

On Sun, 29 Sept 2024 at 06:54, <alice....@oss.nxp.com> wrote:
>
> From: Peng Fan <peng....@nxp.com>
>
> Add timeout support for mbox_send.
>
> Signed-off-by: Peng Fan <peng....@nxp.com>
> Signed-off-by: Alice Guo <alice....@nxp.com>
> Reviewed-by: Ye Li <ye...@nxp.com>
> ---
>  drivers/mailbox/mailbox-uclass.c | 19 ++++++++++++++++++-
>  include/mailbox.h                |  2 ++
>  2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mailbox/mailbox-uclass.c 
> b/drivers/mailbox/mailbox-uclass.c
> index 4bf4987ce0..0ca8b3770f 100644
> --- a/drivers/mailbox/mailbox-uclass.c
> +++ b/drivers/mailbox/mailbox-uclass.c
> @@ -117,10 +117,27 @@ int mbox_free(struct mbox_chan *chan)
>  int mbox_send(struct mbox_chan *chan, const void *data)
>  {
>         struct mbox_ops *ops = mbox_dev_ops(chan->dev);
> +       ulong start_time, timeout_us;
> +       int ret;
>
>         debug("%s(chan=%p, data=%p)\n", __func__, chan, data);
>
> -       return ops->send(chan, data);
> +       start_time = timer_get_us();
> +       timeout_us = chan->tx_timeout_us;
> +       /*
> +        * Account for partial us ticks, but if timeout_us is 0, ensure we
> +        * still don't wait at all.
> +        */
> +       if (timeout_us)
> +               timeout_us++;
> +
> +       for (;;) {
> +               ret = ops->send(chan, data);
> +               if (ret != -EBUSY)
> +                       return ret;
> +               if ((timer_get_us() - start_time) >= timeout_us)

get_timer_us_long(start_time) >= timeout_us

would be better here as it is designed to do the maths for you!

> +                       return -ETIMEDOUT;
> +       }
>  }
>
>  int mbox_recv(struct mbox_chan *chan, void *data, ulong timeout_us)
> diff --git a/include/mailbox.h b/include/mailbox.h
> index e70266fb61..3cc64f20b7 100644
> --- a/include/mailbox.h
> +++ b/include/mailbox.h
> @@ -46,6 +46,7 @@ struct udevice;
>   *
>   * @dev: The device which implements the mailbox.
>   * @id: The mailbox channel ID within the provider.
> + * @tx_timeout_us: The tx timeout in us.
>   * @con_priv: Hook for controller driver to attach private data
>   *
>   * Currently, the mailbox API assumes that a single integer ID is enough to
> @@ -61,6 +62,7 @@ struct mbox_chan {
>         struct udevice *dev;
>         /* Written by of_xlate.*/
>         unsigned long id;
> +       unsigned long tx_timeout_us;

ulong

>         void *con_priv;
>  };
>
> --
> 2.34.1
>

Please also update test/dm/mailbox.c so this new feature is tested in
CI. You can use timer_test_add_offset() in a test to add to the
current (faked) time.

Regards,
Simon

Reply via email to