media: ir_toy: prevent device from hanging during transmit
Subsystems (3)
This is an automatic generated email to let you know that the following patch were queued:
Subject: media: ir_toy: prevent device from hanging during transmit Author: Sean Young <[email protected]> Date: Tue Sep 14 16:57:46 2021 +0200
If the IR Toy is receiving IR while a transmit is done, it may end up hanging. We can prevent this from happening by re-entering sample mode just before issuing the transmit command.
Signed-off-by Sean Young <[email protected]>
Signed-off-by Mauro Carvalho Chehab <[email protected]>
drivers/media/rc/ir_toy.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
---
drivers/media/rc/ir_toy.c +20 -1
@@ -24,6 +24,7 @@ static const u8 COMMAND_VERSION[] = { 'v' };// End transmit and repeat reset command so we exit sump mode static const u8 COMMAND_RESET [] = {0xff ,0xff ,0 ,0 ,0 ,0 ,0 };static const u8 COMMAND_SMODE_ENTER [] = {'s' }; +static const u8 COMMAND_SMODE_EXIT [] = {0 };static const u8 COMMAND_TXSTART [] = {0x26 ,0x24 ,0x25 ,0x03 };#define REPLY_XMITCOUNT 't'
@@ -309,12 +310,30 @@ static int irtoy_tx(struct rc_dev *rc, uint *txbuf, uint count) buf[i] =cpu_to_be16 (v); } - buf[count] =cpu_to_be16 (0xffff ); + buf[count] =0xffff ; irtoy->tx_buf = buf; irtoy->tx_len = size; irtoy->emitted =0 ; +// There is an issue where if the unit is receiving IR while the +// first TXSTART command is sent, the device might end up hanging +// with its led on. It does not respond to any command when this +// happens. To work around this, re-enter sample mode. + err =irtoy_command (irtoy,COMMAND_SMODE_EXIT , +sizeof (COMMAND_SMODE_EXIT ),STATE_RESET ); +if (err) { +dev_err (irtoy->dev,"exit sample mode: %d\n" , err); +return err; + } + + err =irtoy_command (irtoy,COMMAND_SMODE_ENTER , +sizeof (COMMAND_SMODE_ENTER ),STATE_COMMAND ); +if (err) { +dev_err (irtoy->dev,"enter sample mode: %d\n" , err); +return err; + } + err =irtoy_command (irtoy,COMMAND_TXSTART ,sizeof (COMMAND_TXSTART ),STATE_TX );kfree (buf);