From: Dima Zavin Date: Tue, 9 Nov 2010 18:27:18 +0000 (-0800) Subject: media: video: tegra: wait for remote ack on disconnect X-Git-Tag: firefly_0821_release~9833^2~116^2~6 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1ce38cb459a3178a48d10cc42102733782114594;p=firefly-linux-kernel-4.4.55.git media: video: tegra: wait for remote ack on disconnect Change-Id: I42bf507b7d644184bd27be6ff53e5974dcfa3797 Signed-off-by: Dima Zavin --- diff --git a/drivers/media/video/tegra/avp/avp.c b/drivers/media/video/tegra/avp/avp.c index de6034be327c..2fc0fab57309 100644 --- a/drivers/media/video/tegra/avp/avp.c +++ b/drivers/media/video/tegra/avp/avp.c @@ -335,6 +335,10 @@ static int msg_wait_ack_locked(struct avp_info *avp, u32 cmd, u32 *arg) usleep_range(1000, 5000); } while (ret && time_before(jiffies, endtime)); + /* if we timed out, try one more time */ + if (ret) + ret = msg_check_ack(avp, cmd, arg); + /* clear out the ack */ *rem_ack = 0; wmb(); @@ -396,10 +400,25 @@ static int _send_disconnect(struct avp_info *avp, u32 port_id) mutex_lock(&avp->to_avp_lock); ret = msg_write(avp, &msg, sizeof(msg), NULL, 0); - mutex_unlock(&avp->to_avp_lock); + if (ret) { + pr_err("%s: remote has not acked last message (%x)\n", __func__, + port_id); + goto err_msg_write; + } - DBG(AVP_DBG_TRACE_XPC_CONN, "%s: sent disconnect msg for 0x%x\n", + ret = msg_wait_ack_locked(avp, CMD_ACK, NULL); + if (ret) { + pr_err("%s: remote end won't respond for %x\n", __func__, + port_id); + goto err_wait_ack; + } + + DBG(AVP_DBG_TRACE_XPC_CONN, "%s: sent disconnect msg for %x\n", __func__, port_id); + +err_wait_ack: +err_msg_write: + mutex_unlock(&avp->to_avp_lock); return ret; } @@ -613,7 +632,7 @@ static void process_disconnect_locked(struct avp_info *avp, rinfo = remote_find(avp, disconn_msg->port_id); if (!rinfo) { spin_unlock_irqrestore(&avp->state_lock, flags); - pr_warning("%s: got disconnect for unknown port 0x%x\n", + pr_warning("%s: got disconnect for unknown port %x\n", __func__, disconn_msg->port_id); goto ack; }