mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-01 03:23:39 +10:00 
			
		
		
		
	The control queue can be used by different parts of the driver to send commands to the device. Control messages can be either synchronous or asynchronous. The lifetime of a message is controlled by a reference count. Introduce a module parameter to set the message completion timeout: msg_timeout_ms [=1000] Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> Link: https://lore.kernel.org/r/20210302164709.3142702-4-anton.yakovlev@opensynergy.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ */
 | |
| /*
 | |
|  * virtio-snd: Virtio sound device
 | |
|  * Copyright (C) 2021 OpenSynergy GmbH
 | |
|  */
 | |
| #ifndef VIRTIO_SND_MSG_H
 | |
| #define VIRTIO_SND_MSG_H
 | |
| 
 | |
| #include <linux/atomic.h>
 | |
| #include <linux/virtio.h>
 | |
| 
 | |
| struct virtio_snd;
 | |
| struct virtio_snd_msg;
 | |
| 
 | |
| void virtsnd_ctl_msg_ref(struct virtio_snd_msg *msg);
 | |
| 
 | |
| void virtsnd_ctl_msg_unref(struct virtio_snd_msg *msg);
 | |
| 
 | |
| void *virtsnd_ctl_msg_request(struct virtio_snd_msg *msg);
 | |
| 
 | |
| void *virtsnd_ctl_msg_response(struct virtio_snd_msg *msg);
 | |
| 
 | |
| struct virtio_snd_msg *virtsnd_ctl_msg_alloc(size_t request_size,
 | |
| 					     size_t response_size, gfp_t gfp);
 | |
| 
 | |
| int virtsnd_ctl_msg_send(struct virtio_snd *snd, struct virtio_snd_msg *msg,
 | |
| 			 struct scatterlist *out_sgs,
 | |
| 			 struct scatterlist *in_sgs, bool nowait);
 | |
| 
 | |
| /**
 | |
|  * virtsnd_ctl_msg_send_sync() - Simplified sending of synchronous message.
 | |
|  * @snd: VirtIO sound device.
 | |
|  * @msg: Control message.
 | |
|  *
 | |
|  * After returning from this function, the message will be deleted. If message
 | |
|  * content is still needed, the caller must additionally to
 | |
|  * virtsnd_ctl_msg_ref/unref() it.
 | |
|  *
 | |
|  * The msg_timeout_ms module parameter defines the message completion timeout.
 | |
|  * If the message is not completed within this time, the function will return an
 | |
|  * error.
 | |
|  *
 | |
|  * Context: Any context that permits to sleep.
 | |
|  * Return: 0 on success, -errno on failure.
 | |
|  *
 | |
|  * The return value is a message status code (VIRTIO_SND_S_XXX) converted to an
 | |
|  * appropriate -errno value.
 | |
|  */
 | |
| static inline int virtsnd_ctl_msg_send_sync(struct virtio_snd *snd,
 | |
| 					    struct virtio_snd_msg *msg)
 | |
| {
 | |
| 	return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, false);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * virtsnd_ctl_msg_send_async() - Simplified sending of asynchronous message.
 | |
|  * @snd: VirtIO sound device.
 | |
|  * @msg: Control message.
 | |
|  *
 | |
|  * Context: Any context.
 | |
|  * Return: 0 on success, -errno on failure.
 | |
|  */
 | |
| static inline int virtsnd_ctl_msg_send_async(struct virtio_snd *snd,
 | |
| 					     struct virtio_snd_msg *msg)
 | |
| {
 | |
| 	return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, true);
 | |
| }
 | |
| 
 | |
| void virtsnd_ctl_msg_cancel_all(struct virtio_snd *snd);
 | |
| 
 | |
| void virtsnd_ctl_msg_complete(struct virtio_snd_msg *msg);
 | |
| 
 | |
| int virtsnd_ctl_query_info(struct virtio_snd *snd, int command, int start_id,
 | |
| 			   int count, size_t size, void *info);
 | |
| 
 | |
| void virtsnd_ctl_notify_cb(struct virtqueue *vqueue);
 | |
| 
 | |
| #endif /* VIRTIO_SND_MSG_H */
 |