Пример #1
0
static int modem_pipe_read(struct m_pipe *pipe, struct modem_io *io)
{
	unsigned read_size = io->datasize;
	char hdr[M_PIPE_MAX_HDR];
	int ret;

	if (fifo_read(pipe->rx, hdr, pipe->header_size) == 0)
		return -EAGAIN;

	fifo_move_tail(pipe->rx, pipe->header_size);

	ret = pipe->pull_header(io, hdr);
	if (ret)
		return ret;


	if(io->magic != 0xCAFECAFE)
	{
		pr_err("modem_pipe_read: io->magic != 0xCAFECAFE, possible FIFO corruption\n");
		return -EIO;
	}

	if (read_size < io->datasize) {
		pr_info("modem_pipe_read: discarding frame (%d)\n", io->datasize);
		fifo_move_tail(pipe->rx, SIZ_PACKET_BUFSIZE);
		return -EAGAIN;
	} else {
		if (fifo_read_user(pipe->rx, io->data, io->datasize) != io->datasize)
			return -EIO;
		fifo_move_tail(pipe->rx, SIZ_PACKET_BUFSIZE);
	}
	return 0;
}
Пример #2
0
static int modem_pipe_read(struct m_pipe *pipe, struct modem_io *io)
{
	unsigned data_size = io->size;
	char hdr[M_PIPE_MAX_HDR];
	int ret;

	if (fifo_read(pipe->rx, hdr, pipe->header_size) == 0)
		return -EAGAIN;

	ret = pipe->pull_header(io, hdr);
	if (ret)
		return ret;

	if (data_size < io->size) {
		pr_info("modem_pipe_read: discarding packet (%d)\n", io->size);
		if (fifo_skip(pipe->rx, io->size + 1) != (io->size + 1))
			return -EIO;
		return -EAGAIN;
	} else {
		if (fifo_read_user(pipe->rx, io->data, io->size) != io->size)
			return -EIO;
		if (fifo_skip(pipe->rx, 1) != 1)
			return -EIO;
	}
	return 0;
}