| 387 | ****************************************************************************/ |
| 388 | |
| 389 | static ssize_t rpmsgdev_read(FAR struct file *filep, FAR char *buffer, |
| 390 | size_t buflen) |
| 391 | { |
| 392 | FAR struct rpmsgdev_s *dev; |
| 393 | FAR struct rpmsgdev_priv_s *priv; |
| 394 | struct rpmsgdev_read_s msg; |
| 395 | struct iovec read; |
| 396 | uint32_t command; |
| 397 | ssize_t ret; |
| 398 | |
| 399 | if (buffer == NULL) |
| 400 | { |
| 401 | return -EINVAL; |
| 402 | } |
| 403 | |
| 404 | /* Recover our private data from the struct file instance */ |
| 405 | |
| 406 | dev = filep->f_inode->i_private; |
| 407 | priv = filep->f_priv; |
| 408 | DEBUGASSERT(dev != NULL && priv != NULL); |
| 409 | |
| 410 | /* Call the host to perform the read */ |
| 411 | |
| 412 | read.iov_base = buffer; |
| 413 | read.iov_len = 0; |
| 414 | |
| 415 | msg.filep = priv->filep; |
| 416 | msg.count = buflen; |
| 417 | command = dev->flags & RPMSGDEV_NOFRAG_READ ? |
| 418 | RPMSGDEV_READ_NOFRAG : RPMSGDEV_READ; |
| 419 | |
| 420 | for (; ; ) |
| 421 | { |
| 422 | ret = rpmsgdev_send_recv(dev, command, true, &msg.header, |
| 423 | sizeof(msg) - 1, &read); |
| 424 | if (ret != -EAGAIN || read.iov_len > 0 || priv->nonblock) |
| 425 | { |
| 426 | break; |
| 427 | } |
| 428 | |
| 429 | /* If open with block mode and return -EAGAIN, should wait the |
| 430 | * perr device ready and try again until read success or some |
| 431 | * other errors occur. |
| 432 | */ |
| 433 | |
| 434 | ret = rpmsgdev_wait(filep, POLLIN); |
| 435 | if (ret < 0) |
| 436 | { |
| 437 | rpmsgdeverr("read wait failed, ret=%d\n", ret); |
| 438 | break; |
| 439 | } |
| 440 | } |
| 441 | |
| 442 | return read.iov_len ? read.iov_len : ret; |
| 443 | } |
| 444 | |
| 445 | /**************************************************************************** |
| 446 | * Name: rpmsgdev_write |
nothing calls this directly
no test coverage detected