1*9d45e514SAnton Yakovlev /* SPDX-License-Identifier: GPL-2.0+ */
2*9d45e514SAnton Yakovlev /*
3*9d45e514SAnton Yakovlev * virtio-snd: Virtio sound device
4*9d45e514SAnton Yakovlev * Copyright (C) 2021 OpenSynergy GmbH
5*9d45e514SAnton Yakovlev */
6*9d45e514SAnton Yakovlev #ifndef VIRTIO_SND_MSG_H
7*9d45e514SAnton Yakovlev #define VIRTIO_SND_MSG_H
8*9d45e514SAnton Yakovlev
9*9d45e514SAnton Yakovlev #include <linux/atomic.h>
10*9d45e514SAnton Yakovlev #include <linux/virtio.h>
11*9d45e514SAnton Yakovlev
12*9d45e514SAnton Yakovlev struct virtio_snd;
13*9d45e514SAnton Yakovlev struct virtio_snd_msg;
14*9d45e514SAnton Yakovlev
15*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_ref(struct virtio_snd_msg *msg);
16*9d45e514SAnton Yakovlev
17*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_unref(struct virtio_snd_msg *msg);
18*9d45e514SAnton Yakovlev
19*9d45e514SAnton Yakovlev void *virtsnd_ctl_msg_request(struct virtio_snd_msg *msg);
20*9d45e514SAnton Yakovlev
21*9d45e514SAnton Yakovlev void *virtsnd_ctl_msg_response(struct virtio_snd_msg *msg);
22*9d45e514SAnton Yakovlev
23*9d45e514SAnton Yakovlev struct virtio_snd_msg *virtsnd_ctl_msg_alloc(size_t request_size,
24*9d45e514SAnton Yakovlev size_t response_size, gfp_t gfp);
25*9d45e514SAnton Yakovlev
26*9d45e514SAnton Yakovlev int virtsnd_ctl_msg_send(struct virtio_snd *snd, struct virtio_snd_msg *msg,
27*9d45e514SAnton Yakovlev struct scatterlist *out_sgs,
28*9d45e514SAnton Yakovlev struct scatterlist *in_sgs, bool nowait);
29*9d45e514SAnton Yakovlev
30*9d45e514SAnton Yakovlev /**
31*9d45e514SAnton Yakovlev * virtsnd_ctl_msg_send_sync() - Simplified sending of synchronous message.
32*9d45e514SAnton Yakovlev * @snd: VirtIO sound device.
33*9d45e514SAnton Yakovlev * @msg: Control message.
34*9d45e514SAnton Yakovlev *
35*9d45e514SAnton Yakovlev * After returning from this function, the message will be deleted. If message
36*9d45e514SAnton Yakovlev * content is still needed, the caller must additionally to
37*9d45e514SAnton Yakovlev * virtsnd_ctl_msg_ref/unref() it.
38*9d45e514SAnton Yakovlev *
39*9d45e514SAnton Yakovlev * The msg_timeout_ms module parameter defines the message completion timeout.
40*9d45e514SAnton Yakovlev * If the message is not completed within this time, the function will return an
41*9d45e514SAnton Yakovlev * error.
42*9d45e514SAnton Yakovlev *
43*9d45e514SAnton Yakovlev * Context: Any context that permits to sleep.
44*9d45e514SAnton Yakovlev * Return: 0 on success, -errno on failure.
45*9d45e514SAnton Yakovlev *
46*9d45e514SAnton Yakovlev * The return value is a message status code (VIRTIO_SND_S_XXX) converted to an
47*9d45e514SAnton Yakovlev * appropriate -errno value.
48*9d45e514SAnton Yakovlev */
virtsnd_ctl_msg_send_sync(struct virtio_snd * snd,struct virtio_snd_msg * msg)49*9d45e514SAnton Yakovlev static inline int virtsnd_ctl_msg_send_sync(struct virtio_snd *snd,
50*9d45e514SAnton Yakovlev struct virtio_snd_msg *msg)
51*9d45e514SAnton Yakovlev {
52*9d45e514SAnton Yakovlev return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, false);
53*9d45e514SAnton Yakovlev }
54*9d45e514SAnton Yakovlev
55*9d45e514SAnton Yakovlev /**
56*9d45e514SAnton Yakovlev * virtsnd_ctl_msg_send_async() - Simplified sending of asynchronous message.
57*9d45e514SAnton Yakovlev * @snd: VirtIO sound device.
58*9d45e514SAnton Yakovlev * @msg: Control message.
59*9d45e514SAnton Yakovlev *
60*9d45e514SAnton Yakovlev * Context: Any context.
61*9d45e514SAnton Yakovlev * Return: 0 on success, -errno on failure.
62*9d45e514SAnton Yakovlev */
virtsnd_ctl_msg_send_async(struct virtio_snd * snd,struct virtio_snd_msg * msg)63*9d45e514SAnton Yakovlev static inline int virtsnd_ctl_msg_send_async(struct virtio_snd *snd,
64*9d45e514SAnton Yakovlev struct virtio_snd_msg *msg)
65*9d45e514SAnton Yakovlev {
66*9d45e514SAnton Yakovlev return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, true);
67*9d45e514SAnton Yakovlev }
68*9d45e514SAnton Yakovlev
69*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_cancel_all(struct virtio_snd *snd);
70*9d45e514SAnton Yakovlev
71*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_complete(struct virtio_snd_msg *msg);
72*9d45e514SAnton Yakovlev
73*9d45e514SAnton Yakovlev int virtsnd_ctl_query_info(struct virtio_snd *snd, int command, int start_id,
74*9d45e514SAnton Yakovlev int count, size_t size, void *info);
75*9d45e514SAnton Yakovlev
76*9d45e514SAnton Yakovlev void virtsnd_ctl_notify_cb(struct virtqueue *vqueue);
77*9d45e514SAnton Yakovlev
78*9d45e514SAnton Yakovlev #endif /* VIRTIO_SND_MSG_H */
79