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