| 649 | ****************************************************************************/ |
| 650 | |
| 651 | static int rpmsgdev_ioctl(FAR struct file *filep, int cmd, unsigned long arg) |
| 652 | { |
| 653 | FAR struct rpmsgdev_s *dev; |
| 654 | FAR struct rpmsgdev_priv_s *priv; |
| 655 | FAR struct rpmsgdev_ioctl_s *msg; |
| 656 | uint32_t space; |
| 657 | ssize_t arglen; |
| 658 | size_t msglen; |
| 659 | int ret; |
| 660 | |
| 661 | /* Recover our private data from the struct file instance */ |
| 662 | |
| 663 | dev = filep->f_inode->i_private; |
| 664 | priv = filep->f_priv; |
| 665 | DEBUGASSERT(dev != NULL && priv != NULL); |
| 666 | |
| 667 | /* Call our internal routine to perform the ioctl */ |
| 668 | |
| 669 | arglen = rpmsgdev_ioctl_arglen(cmd, arg); |
| 670 | if (arglen < 0) |
| 671 | { |
| 672 | return arglen; |
| 673 | } |
| 674 | |
| 675 | msglen = sizeof(*msg) + arglen - 1; |
| 676 | |
| 677 | msg = rpmsgdev_get_tx_payload_buffer(dev, &space); |
| 678 | if (msg == NULL) |
| 679 | { |
| 680 | return -ENOMEM; |
| 681 | } |
| 682 | |
| 683 | msg->filep = priv->filep; |
| 684 | msg->request = cmd; |
| 685 | msg->arg = arg; |
| 686 | msg->arglen = arglen; |
| 687 | |
| 688 | if (arglen > 0) |
| 689 | { |
| 690 | memcpy(msg->buf, (FAR void *)(uintptr_t)arg, arglen); |
| 691 | } |
| 692 | |
| 693 | ret = rpmsgdev_send_recv(dev, RPMSGDEV_IOCTL, false, &msg->header, |
| 694 | msglen, arglen > 0 ? (FAR void *)arg : NULL); |
| 695 | if (cmd == FIONBIO && ret >= 0) |
| 696 | { |
| 697 | FAR int *nonblock = (FAR int *)(uintptr_t)arg; |
| 698 | priv->nonblock = *nonblock; |
| 699 | } |
| 700 | |
| 701 | return ret; |
| 702 | } |
| 703 | |
| 704 | /**************************************************************************** |
| 705 | * Name: rpmsgdev_poll |
nothing calls this directly
no test coverage detected