mailbox: Make mbox_send_message() return error code when tx fails
Subsystems (2)
PATCH v2 2/2 mailbox: Make mbox_send_message() return error code when tx fails
When the mailbox controller failed transmitting message, the error code was only passed to the client's tx done handler and not to mbox_send_message(). For this reason, the function could return a false success. This commit resolves the issue by introducing the tx status and checking it before mbox_send_message() returns.
Signed-off-by Joonwon Kang <[email protected]>
---
v1 -> v2: No major change.
drivers/mailbox/mailbox.c | 20 +++++++++++++++----- include/linux/mailbox_controller.h | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-)
drivers/mailbox/mailbox.c +15 -5
@@ -26,7 +26,10 @@static LIST_HEAD (mbox_cons);static DEFINE_MUTEX (con_mutex); -static int add_to_rbuf (struct mbox_chan *chan,void *mssg,struct completion *tx_complete) +static int add_to_rbuf (struct mbox_chan *chan, +void *mssg, +struct completion *tx_complete, +int *tx_status) {int idx;
@@ -39,6 +42,7 @@ static int add_to_rbuf(struct mbox_chan *chan, void *mssg, struct completion *tx idx = chan->msg_free; chan->msg_data[idx].data = mssg; chan->msg_data[idx].tx_complete = tx_complete; + chan->msg_data[idx].tx_status = tx_status; chan->msg_count++;if (idx ==MBOX_TX_QUEUE_LEN -1 )
@@ -96,7 +100,7 @@ static void msg_submit(struct mbox_chan *chan)static void tx_tick (struct mbox_chan *chan,int r,int idx) { -struct mbox_message mssg = {NULL ,NULL }; +struct mbox_message mssg = {NULL ,NULL ,NULL }; scoped_guard(spinlock_irqsave, &chan->lock) {if (idx ==MBOX_IDX_NOT_DESIGNATED || idx == chan->active_req) {
@@ -107,6 +111,7 @@ static void tx_tick(struct mbox_chan *chan, int r, int idx) }else { chan->msg_data[idx].data =MBOX_DATA_CANCELED ; chan->msg_data[idx].tx_complete =NULL ; + chan->msg_data[idx].tx_status =NULL ;return ; } }
@@ -121,8 +126,10 @@ static void tx_tick(struct mbox_chan *chan, int r, int idx)if (chan->cl->tx_done) chan->cl->tx_done (chan->cl, mssg.data, r); -if (r != -ETIME && chan->cl->tx_block) +if (r != -ETIME && chan->cl->tx_block) { + *mssg.tx_status = r;complete (mssg.tx_complete); + } }static enum hrtimer_restart txdone_hrtimer (struct hrtimer *hrtimer)
@@ -268,15 +275,16 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg)int t;int idx;struct completion tx_complete; +int tx_status =0 ;if (!chan || !chan->cl)return -EINVAL ;if (chan->cl->tx_block) {init_completion (&tx_complete); - t =add_to_rbuf (chan, mssg, &tx_complete); + t =add_to_rbuf (chan, mssg, &tx_complete, &tx_status); }else { - t =add_to_rbuf (chan, mssg,NULL ); + t =add_to_rbuf (chan, mssg,NULL ,NULL ); }if (t <0 ) {
@@ -300,6 +308,8 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg) idx = t; t = -ETIME ;tx_tick (chan, t, idx); + }else if (tx_status <0 ) { + t = tx_status; } }
include/linux/mailbox_controller.h +2 -0
@@ -109,10 +109,12 @@ struct mbox_controller {* struct mbox_message - Internal representation of a mailbox message * @data: Data packet * @tx_complete: Pointer to the transmission completion +* @tx_status: Pointer to the transmission status */ struct mbox_message {void *data;struct completion *tx_complete; +int *tx_status; };/**
Signature · 1 line
2.53.0.rc2.204.g2597b5adb4-goog