static int ps3av_send_cmd_pkt()

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;
}