Hi, On Fri, May 31, 2019 at 5:09 PM Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> wrote: > > On Fri 31 May 15:24 PDT 2019, Doug Anderson wrote: > > > Hi, > > > > On Thu, May 30, 2019 at 8:01 PM Bjorn Andersson > > <bjorn.andersson@xxxxxxxxxx> wrote: > > > > > > +/** > > > + * qmp_send() - send a message to the AOSS > > > + * @qmp: qmp context > > > + * @data: message to be sent > > > + * @len: length of the message > > > + * > > > + * Transmit @data to AOSS and wait for the AOSS to acknowledge the message. > > > + * @len must be a multiple of 4 and not longer than the mailbox size. Access is > > > + * synchronized by this implementation. > > > + * > > > + * Return: 0 on success, negative errno on failure > > > + */ > > > +static int qmp_send(struct qmp *qmp, const void *data, size_t len) > > > +{ > > > + int ret; > > > + > > > + if (WARN_ON(len + sizeof(u32) > qmp->size)) > > > + return -EINVAL; > > > + > > > + if (WARN_ON(len % sizeof(u32))) > > > + return -EINVAL; > > > + > > > + mutex_lock(&qmp->tx_lock); > > > + > > > + /* The message RAM only implements 32-bit accesses */ > > > + __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32), > > > + data, len / sizeof(u32)); > > > + writel(len, qmp->msgram + qmp->offset); > > > + qmp_kick(qmp); > > > + > > > + ret = wait_event_interruptible_timeout(qmp->event, > > > + qmp_message_empty(qmp), HZ); > > > + if (!ret) { > > > + dev_err(qmp->dev, "ucore did not ack channel\n"); > > > + ret = -ETIMEDOUT; > > > + > > > + /* Clear message from buffer */ > > > + writel(0, qmp->msgram + qmp->offset); > > > + } else { > > > + ret = 0; > > > + } > > > > Just like Vinod said in in v7, the "ret = 0" is redundant. > > > > If the condition passed to wait_event_interruptible_timeout() evaluates > true the remote side has consumed the message and ret will be 1. We end > up in the else block (i.e. not timeout) and we want the function to > return 0, so we set ret to 0. > > Please let me know if I'm reading this wrong. Ah, it's me that's confused. I missed the "!" on ret. Maybe it'd be less confusing if you did: time_left = wait_event_interruptible_timeout(...) if (!time_left) Even though you _can_ use "ret", it's less confusing to use a different variable since (often) ret is an error code. Speaking of which: do you actually handle the case where you get an interrupt? Should the above just be wait_event_timeout()?