/** * rpmsg_virtio_enqueue_buffer * * Places buffer on the virtqueue for consumption by the other side. * * @param rvdev - pointer to rpmsg virtio * @param buffer - buffer pointer * @param len - buffer length * @param idx - buffer index * * @return - status of function execution */ static int rpmsg_virtio_enqueue_buffer(struct rpmsg_virtio_device *rvdev, void *buffer, uint32_t len, uint16_t idx) { unsigned int role = rpmsg_virtio_get_role(rvdev); #ifndef VIRTIO_SLAVE_ONLY if (role == RPMSG_MASTER) { struct virtqueue_buf vqbuf; (void)idx; /* Initialize buffer node */ vqbuf.buf = buffer; vqbuf.len = len; return virtqueue_add_buffer(rvdev->svq, &vqbuf, 1, 0, buffer); } #endif /*!VIRTIO_SLAVE_ONLY*/ #ifndef VIRTIO_MASTER_ONLY if (role == RPMSG_REMOTE) { (void)buffer; return virtqueue_add_consumed_buffer(rvdev->svq, idx, len); } #endif /*!VIRTIO_MASTER_ONLY*/ return 0; }
/** * rpmsg_return_buffer * * Places the used buffer back on the virtqueue. * * @param rdev - pointer to remote core * @param buffer - buffer pointer * @param len - buffer length * @param idx - buffer index * */ void rpmsg_return_buffer(struct remote_device *rdev, void *buffer, unsigned long len, unsigned short idx) { struct llist node; /* Initialize buffer node */ node.data = buffer; node.attr = len; node.next = RPMSG_NULL; node.prev = RPMSG_NULL; if (rdev->role == RPMSG_REMOTE) { virtqueue_add_buffer(rdev->rvq, &node, 0, 1, buffer); } else { virtqueue_add_consumed_buffer(rdev->rvq, idx, len); } }