media: ir_toy: prevent device from hanging during transmit
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. Link: https://github.com/bengtmartensson/HarcHardware/discussions/25 Cc: stable@vger.kernel.org Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Родитель
3ad02c27d8
Коммит
f0c15b360f
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче