in ps3av.c [206:260]
static int ps3av_send_cmd_pkt(const struct ps3av_send_hdr *send_buf,
struct ps3av_reply_hdr *recv_buf, int write_len,
int read_len)
{
int res;
u32 cmd;
int event;
if (!ps3av)
return -ENODEV;
/* send pkt */
res = ps3av_vuart_write(ps3av->dev, send_buf, write_len);
if (res < 0) {
dev_warn(&ps3av->dev->core,
"%s:%d: ps3av_vuart_write() failed: %s\n", __func__,
__LINE__, ps3_result(res));
return res;
}
/* recv pkt */
cmd = send_buf->cid;
do {
/* read header */
res = ps3av_vuart_read(ps3av->dev, recv_buf, PS3AV_HDR_SIZE,
timeout);
if (res != PS3AV_HDR_SIZE) {
dev_warn(&ps3av->dev->core,
"%s:%d: ps3av_vuart_read() failed: %s\n", __func__,
__LINE__, ps3_result(res));
return res;
}
/* read body */
res = ps3av_vuart_read(ps3av->dev, &recv_buf->cid,
recv_buf->size, timeout);
if (res < 0) {
dev_warn(&ps3av->dev->core,
"%s:%d: ps3av_vuart_read() failed: %s\n", __func__,
__LINE__, ps3_result(res));
return res;
}
res += PS3AV_HDR_SIZE; /* total len */
event = ps3av_parse_event_packet(recv_buf);
/* ret > 0 event packet */
} while (event);
if ((cmd | PS3AV_REPLY_BIT) != recv_buf->cid) {
dev_warn(&ps3av->dev->core, "%s:%d: reply err: %x\n", __func__,
__LINE__, recv_buf->cid);
return -EINVAL;
}
return 0;
}