If a non-blocking transmit failed (either the transmit itself failed, or the reply (if requested) never arrived, then the received callback is still called since in some cases a driver might need to know about that. The vivid_received function didn't check this and instead could try to transmit a reply, which can lead to a deadlock. Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> --- diff --git a/drivers/media/test-drivers/vivid/vivid-cec.c b/drivers/media/test-drivers/vivid/vivid-cec.c index 1f7469ff04d5..8399298d54ad 100644 --- a/drivers/media/test-drivers/vivid/vivid-cec.c +++ b/drivers/media/test-drivers/vivid/vivid-cec.c @@ -269,6 +269,9 @@ static int vivid_received(struct cec_adapter *adap, struct cec_msg *msg) u8 disp_ctl; char osd[14]; + if (!cec_msg_status_is_ok(msg)) + return 0; + if (cec_msg_is_broadcast(msg)) dest = adap->log_addrs.log_addr[0]; cec_msg_init(&reply, dest, cec_msg_initiator(msg));