Skip to content

Commit

Permalink
[media] iguanair: intermittent initialization failure
Browse files Browse the repository at this point in the history
On cold boot the device does not initialize until the first packet is
received, and that packet is not processed.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Sean Young authored and Mauro Carvalho Chehab committed Feb 5, 2013
1 parent d0aab65 commit c6a3ea5
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions drivers/media/rc/iguanair.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ struct iguanair {
char phys[64];
};

#define CMD_NOP 0x00
#define CMD_GET_VERSION 0x01
#define CMD_GET_BUFSIZE 0x11
#define CMD_GET_FEATURES 0x10
Expand Down Expand Up @@ -196,6 +197,10 @@ static void iguanair_irq_out(struct urb *urb)

if (urb->status)
dev_dbg(ir->dev, "Error: out urb status = %d\n", urb->status);

/* if we sent an nop packet, do not expect a response */
if (urb->status == 0 && ir->packet->header.cmd == CMD_NOP)
complete(&ir->completion);
}

static int iguanair_send(struct iguanair *ir, unsigned size)
Expand All @@ -219,10 +224,17 @@ static int iguanair_get_features(struct iguanair *ir)
{
int rc;

/*
* On cold boot, the iguanair initializes on the first packet
* received but does not process that packet. Send an empty
* packet.
*/
ir->packet->header.start = 0;
ir->packet->header.direction = DIR_OUT;
ir->packet->header.cmd = CMD_GET_VERSION;
ir->packet->header.cmd = CMD_NOP;
iguanair_send(ir, sizeof(ir->packet->header));

ir->packet->header.cmd = CMD_GET_VERSION;
rc = iguanair_send(ir, sizeof(ir->packet->header));
if (rc) {
dev_info(ir->dev, "failed to get version\n");
Expand Down Expand Up @@ -255,29 +267,22 @@ static int iguanair_get_features(struct iguanair *ir)
ir->packet->header.cmd = CMD_GET_FEATURES;

rc = iguanair_send(ir, sizeof(ir->packet->header));
if (rc) {
if (rc)
dev_info(ir->dev, "failed to get features\n");
goto out;
}

out:
return rc;
}

static int iguanair_receiver(struct iguanair *ir, bool enable)
{
int rc;

ir->packet->header.start = 0;
ir->packet->header.direction = DIR_OUT;
ir->packet->header.cmd = enable ? CMD_RECEIVER_ON : CMD_RECEIVER_OFF;

if (enable)
ir_raw_event_reset(ir->rc);

rc = iguanair_send(ir, sizeof(ir->packet->header));

return rc;
return iguanair_send(ir, sizeof(ir->packet->header));
}

/*
Expand Down

0 comments on commit c6a3ea5

Please sign in to comment.